package com.cskaoyan.javase.oop1._12static._1basic;

/**
 * 引例
 * 宠物公司新进了一批同样颜色的猫，创建一个类描述这批宠物
 * 注：创建该类时，给出一个静态成员变量和一个静态成员方法。
 *
 * static修饰的成员，称之为静态成员，包括静态成员变量和静态成员方法。
 * 静态成员的访问并不依赖于创建对象，可以直接通过类名访问，其原因在于：
 *
 * 随着类加载完毕，静态成员就存在，并且能够使用了！
 *      1.静态成员变量在类加载过程中完成默认初始化具有默认值，然后进行一些其它赋值，类加载结束就可以访问了。(整个创建和赋值的过程都是类加载过程中就可以完成的)
 *      静态成员变量的赋值也是先进行默认初始化，然后考虑其它赋值手段。
 *      2.静态成员方法的二进制指令集合在类加载过程也准备完毕，可以调用了。
 *
 * 思考:
 *      1.某个类的类加载至多只有一次,那么某个类的静态成员变量有几份呢?
 *          也只有一份,且这一份被全体对象所共享
 *
 *      2.类加载先于创建对象而进行,那么如果想要访问某个类的静态成员,不进行类加载,可能吗?
 *      显然不可能
 *      所以访问类的静态成员,是一种触发类加载的时机
 *      总结类加载的时机:
 *          1.new对象
 *          2.启动main方法
 *          3.访问类的静态成员
 *
 *  注意事项:
 *      静态成员方法可不是在类加载过程中，会自动被调用的方法！！！
 *      静态成员方法可不是在类加载过程中，会自动被调用的方法！！！
 *      静态成员方法可不是在类加载过程中，会自动被调用的方法！！！
 *
 * @since 10:02
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        /*
            下面这种赋值 是在类加载完毕后的赋值方式
         */
        Cat.color = "红色";
        System.out.println(Cat.color);
        Cat.eat();
        Cat c = new Cat();
    }
}

class Cat {
    /*
        静态成员变量的赋值
        显式赋值和默认初始化赋值都是在类加载过程中完成的
     */
    static String color = "白色";
    int age;

    public static void eat() {
        System.out.println("吃猫粮!");
    }
}